class Dep {
    constructor() {
      this.subscribers = new Set();
    }
    depend() {
      if (activeWatcher) {
        console.log(activeWatcher,"activeWatcher");
        this.subscribers.add(activeWatcher);
      }
    }
    notify() {
      this.subscribers.forEach(watcher => watcher.update());
    }
  }
  
  let activeWatcher = null;
  
  class Watcher {
    constructor(updateFn) {
      this.updateFn = updateFn;
      this.update();
    }
    update() {
      activeWatcher = this;
      this.updateFn();
      activeWatcher = null;
    }
  }
  
  // function defineReactive(obj, key) {
  //   let value = obj[key];
  //   const dep = new Dep();
  
  //   Object.defineProperty(obj, key, {
  //     get() {
  //       dep.depend(); // 收集依赖
  //       return value;
  //     },
  //     set(newValue) {
  //       if (newValue !== value) {
  //         value = newValue;
  //         dep.notify(); // 通知更新
  //       }
  //     },
  //   });
  // }

  const schema = [
    {
      "filedId":"filedId_1",
       "required":true,
       "type":"string",
       "label":"姓名",
       "placeholder":"请输入姓名",
       "display":"visible",
    },
    {
      "filedId":"filedId_2",
       "required":true,
       "type":"string",
       "label":"年龄",
       "placeholder":"请输入年龄",
       "display":"visible",
    }
  ]
  
  
  const model = {
     "filedId_1":"fan",
     "filedId_2":"jian",
     "filedId_3":"tao",
     "filedId_4":[
       {
         "filedId_5":"fan",
         "filedId_6":"jian",
         "filedId_7":"tao",
       }
     ]
  }
  

  // 将 data 转换为响应式
  // Object.keys(vm.data).forEach(key => defineReactive(vm.data, key));

const schemaFactoryMap = new Map();
const runTask = new Map();
class Factory {
  constructor(options){
    this.dep = new Dep();
    this.model = model;
    this.runTask = runTask;
    // 合并 表单数据
    Object.assign(this,options);
    this.bind();
  }
  render(){
    console.log("模拟渲染",this.filedId,this.dep);
    const runTask =  this.runTask.get(this.filedId);
    runTask && runTask.notify();
    console.log(this);
    
  }
  cahnge(value){
    if(value){
      this.model[this.filedId] = value;
      this.notify();
    }
  
  }
  notify(){
    this.dep.notify();
  }
  bind(){
    // 绑定依赖关系
    // this.filedId == "filedId_1" &&  new Watcher(() => {
    //     this.dep.depend();
    //     if(this.model.filedId_1 == 2){
    //       const target = schemaFactoryMap.get('filedId_2');
    //       if(target){
    //         target.display = 'none';
    //       }else{
    //         console.log(target,"target_-不存在","filedId_2");
    //         this.runTask.set('filedId_2',this);
    //       }
    //     }else{
    //       const target = schemaFactoryMap.get('filedId_2');
    //       if(target){
    //         target.display = 'visible';
    //       }else{
    //         console.log(target,"target_-不存在","filedId_2");
    //         this.runTask.set('filedId_2',this);
    //       }
    //     }
    // });

    // this.filedId == "filedId_1" &&  new Watcher(() => {
    //   this.dep.depend();
    //   if(this.model.filedId_1 == 3){
    //     const target = schemaFactoryMap.get('filedId_2');
    //     if(target){
    //       target.required = false;
    //     }else{
    //       console.log(target,"target_-不存在","filedId_2");
    //       this.runTask.set('filedId_2',this);
    //     }
    //   }else{
    //     const target = schemaFactoryMap.get('filedId_2');
    //     if(target){
    //       target.required = true;
    //     }else{
    //       console.log(target,"target_-不存在","filedId_2");
    //       this.runTask.set('filedId_2',this);
    //     }
    //   }
    // });

    // this.filedId == "filedId_2" &&  new Watcher(() => {
    //   // this.dep.depend();
    //   const target = schemaFactoryMap.get('filedId_1');
    //   target && target.dep.depend(); // 目标收集依赖
    //   if(this.model.filedId_1== 6){
    //     target.required = false;
    //     console.log(target,"存在执行sset");
    //   }else{
    //     target.required = true;
    //   }
    // })
   
  }
}

//  schema.forEach(option => {
//    const factory = new Factory(option);
//    schemaFactoryMap.set(factory.filedId,factory);
  
//   if(factory.filedId == "filedId_1"){
//     factory.cahnge(2);
//   }
//   factory.render();
 
// });


// schemaFactoryMap.get('filedId_1').cahnge(2);
// console.log(schemaFactoryMap,"schemaFactoryMap");

// setTimeout(() => {
//   // 派发更新
//   schemaFactoryMap.get('filedId_1').cahnge(6);
//   console.log(schemaFactoryMap,"schemaFactoryMap");
// }, 2000);


// schemaFactory.forEach(item => {
//   item.render();
//   console.log(item);
// })




  

  
  // 测试
  //vm.data.firstName = 'Jane'; // 输出: fullName updated: Jane Doe